package com.mipo.client.javase.designerpattern.proxypattern.dynamicproxy.cglib;

/**
	Cglib代理
	上面的静态代理和动态代理模式都是要求目标对象是实现一个接口的目标对象,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用以目标对象子类的方式类实现代理,这种方法就叫做:Cglib代理
	Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展.
	•JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现.
	•Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的被许多AOP的框架使用,例如Spring AOP和synaop,为他们提供方法的interception(拦截)
	•Cglib包的底层是通过使用一个小而块的字节码处理框架ASM来转换字节码并生成新的类.不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉.
	Cglib子类代理实现方法:
	1.需要引入cglib的jar文件,但是Spring的核心包中已经包括了Cglib功能,所以直接引入spring-core-3.2.5.jar即可.
	2.引入功能包后,就可以在内存中动态构建子类
	3.代理的类不能为final,否则报错
	4.目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.
	在Spring的AOP编程中:
	如果加入容器的目标对象有实现接口,用JDK代理
	如果目标对象没有实现接口,用Cglib代理
	目标对象类:UserDao.java
	Cglib代理工厂:ProxyFactory.java
	
	优点：实用 CGLib 动态代理的优势很明显，有了它，我们就可以为没有接口的类包装前置和后置方法了。从这点来说，它比无论是 JDK 动态代理还是静态代理都灵活的多。
	缺点：既然它比 JDK 动态代理还要灵活，那么我为什么还要在前面花那么多篇幅去介绍 JDK 动态代理呢？这就不得不提它的一个很大的缺点了。
		  通过上述介绍我们可以看到，代理是一种非常有意思的模式。本文具体介绍了三种代理实现方式，静态代理、JDK动态代理 以及 CGLib动态代理。
	这三种代理方式各有优劣，它们的优点在于：
		  我们通过在原有的调用逻辑过程中，再抽一个代理类的方式，使调用逻辑的变化尽可能的封装再代理类的内部中，达到不去改动原有被代理类的方法的情况下，增加新的动作的效果。
		  这就使得即便在未来的使用场景中有更多的拓展，改变也依然很难波及被代理类，我们也就可以放心的对被代理类的特定方法进行复用了
	从缺点来看：
		  静态代理和JDK动态代理都需要被代理类的接口信息以确定特定的方法进行拦截和包装。
		  CGLib动态代理虽然不需要接口信息，但是它拦截并包装被代理类的所有方法。
	动态代理的优势就是实现无侵入式的代码扩展。
	目前动态代理主要分为JAVA自己提供的动态代理和CGLIB类似框架。
	JAVA自带的动态代理是需要接口的。CGLIB这种则是直接修改字节码。
		  
	动态代理实现了可以在原始类和接口还未知的时候，就确定代理类的代理行为 。
	相对静态代理， 如果不同接口的某些类想使用代理模式来实现相同的功能 ，静态代理需要实现多个代理类，动态代理只需要实现一个代理类。
		  
 */
public class Main {
	
    public static void main(String[] args){
        UserDao target = new UserDao();
        UserDao proxy = (UserDao)new ProxyFactory(target).getProxyInstance();
        proxy.save();
        String Strin8g = "";
        Strin8g = Strin8g + "2";
    }
    
}







